package com.atguigu.tingshu.search.service;

import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import com.atguigu.tingshu.model.search.SuggestIndex;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface SearchService {


    /**
     * 上架专辑到索引库
     * @param albumId
     */
    void upperAlbum(Long albumId);

    /**
     * 从索引库中删除专辑
     * @param albumId
     */
    void lowerAlbum(Long albumId);

    /**
     * 根据关键字、分类ID、属性/属性值进行专辑检索
     *
     * @param queryVo
     * @return
     */
    AlbumSearchResponseVo search(AlbumIndexQuery queryVo);

    /**
     * 根据用户检索条件构建检索请求对象
     * @param queryVo
     * @return
     */
    SearchRequest buildDSL(AlbumIndexQuery queryVo);

    /**
     * 解析ES检索结果，封装自定义结果
     *
     * @param response
     * @param queryVo
     * @return
     */
    AlbumSearchResponseVo parseResult(SearchResponse<AlbumInfoIndex> response, AlbumIndexQuery queryVo);

    /**
     * 查询首页每个三级分类下热门专辑列表
     *
     * @param category1Id
     * @return
     */
    List<Map<String, Object>> getCategory3Top6Hot(Long category1Id);


    /**
     * 新增提词库索引文档
     * @param albumInfoIndex
     */
    void saveSuggestDoc(AlbumInfoIndex albumInfoIndex);

    /**
     * 关键字自动补全
     *
     * @param keyword
     * @return
     */
    List<String> completeSuggest(String keyword);

    /**
     * 解析提词结果
     * @param searchResponse
     * @param suggestName
     * @return
     */
    List<String> parseSugggestResult(SearchResponse<SuggestIndex> searchResponse, String suggestName);


    /**
     * 更新排行数据,从ES中获取不同分类下不同排行列表，存入Redis中hash
     *
     * @return
     */
    void updateLatelyAlbumRanking();

    /**
     * 获取Redis中不同分类下不同排序方式-专辑排行榜
     *
     * @param category1Id
     * @param dimension
     * @return
     */
    List<AlbumInfoIndex> getRankingList(Long category1Id, String dimension);
}
